iT邦幫忙

2024 iThome 鐵人賽

DAY 9
0
Software Development

深入淺出Java 30天系列 第 9

Day 9: 覆寫equals時的注意事項和規範(上)

  • 分享至 

  • xImage
  •  

什麼時候不要覆寫equals

  • 類別產生的每個物件都是唯一的: 例如Thread,每個thread的行為表現都是唯一的,無法單純地用equals去判斷兩個物件一不一樣,thread只能跟自己一樣,所以不適合覆寫。
  • 類別根本不需要使用equals去驗證兩個物件的值相不相同: 一般來說,我們不會刻意去驗證java.util.Random產生出來的值一不一樣,所以沒必要去覆寫。
  • 父類別已經覆寫equals且也符合子類別的需求。
  • 類別是private或package private,根本不會使用equals
  • 使用Item 1(static factory method)或singleton時,已經確保物件是唯一。
  • Enum type

覆寫equals雖然很簡單,但會引發一些錯誤,非必要還是不要使用,真的需要覆寫equals的情境,大部分會是需要確認物件裡面的某個值是不是相同,才需要覆寫。舉例來說,像是IntegerDate,因為需要比較數字相不相同和時間一不一樣的需求,就很適合覆寫equals

override equals需要注意什麼?

  • 覆寫equals時,必須也覆寫hashCode。兩個物件相等,基本上hash code也要一樣,不然在使用HashMap等跟hash有關的collection時,會出現令人困惑的情況,同一個HashMap的兩個key,居然是相等的。
  • 不要讓equals裡面的判斷邏輯太過複雜。
  • 不要把equals的參數型別Object修改成其他型別,因為這個不是override而是overloads。
public boolean equals(Point obj) {
  .....
}
  • 記得在覆寫equals時加上@Override這個annotation,可以避免上一個問題。

今天寫的大部分都是一些注意事項,明天再來說明,要覆寫equals時,有哪些規則需要遵守。


上一篇
Day 8: 避免使用finalizers
下一篇
Day 10: 覆寫equals時的注意事項和規範(下)
系列文
深入淺出Java 30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言